#pragma once

#include <queue>
#include <mutex>
#include <condition_variable>

// 线程安全队列
// 线程安全队列是一种线程安全的数据结构，它允许多个线程安全地访问其元素。
// 队列的操作是线程安全的，这意味着多个线程可以同时对队列进行操作，而不会导致数据结构的不一致。
// 队列的实现使用了 std::queue 和 std::mutex 类。
// 队列的 push() 操作使用 std::lock_guard 类对 mutex_ 进行加锁，确保 push() 操作的原子性。
// 线程安全队列
template <typename T> class ThreadSafeQueue {
  public:
    void push(const T &value) {
        std::lock_guard<std::mutex> lock(mutex_);
        queue_.push(value);
        cond_.notify_one();
    }

    bool pop(T &value) {
        std::unique_lock<std::mutex> lock(mutex_);
        cond_.wait(lock, [this] { return !queue_.empty() || stop_; });
        if (stop_) return false;
        value = queue_.front();
        queue_.pop();
        return true;
    }

    void stop() {
        std::lock_guard<std::mutex> lock(mutex_);
        stop_ = true;
        cond_.notify_all();
    }

  private:
    std::queue<T> queue_;
    std::mutex mutex_;
    std::condition_variable cond_;
    bool stop_ = false;
};
// 任务结构体
struct Task {
    int fd;
    std::vector<char> data;
};

void init_thread_pool(int thread_pool_size);
void add_task(const Task &task);
void destroy_thread_pool();